/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pt.iasd.youthshelter.pathfinder.wizards;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;
import pt.iasd.youthshelter.datamodel.Pathfinder;
import pt.iasd.youthshelter.datamodel.PathfinderRole;
import pt.iasd.youthshelter.datamodel.Role;

public class EditPathfinderRoleWizardPanel implements WizardDescriptor.Panel<WizardDescriptor>, PropertyChangeListener {
    private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("pt/iasd/youthshelter/pathfinder/Bundle");

    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private PathfinderRoleVisualPanel component;
    
    private WizardDescriptor descriptor;
    
    private final EventListenerList listeners = new EventListenerList();
    
    private boolean isValid = false;
    
    private List<PathfinderRole> pathfinderRoles;
    
    private int oldId;
    private Pathfinder oldPathfinder;
    private Role oldRole;
    private String oldPlace;
    private Date oldStartDate, oldEndDate;

    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    @Override
    public PathfinderRoleVisualPanel getComponent() {
        if (component == null) {
            component = new PathfinderRoleVisualPanel(oldPathfinder, oldRole, oldPlace, oldStartDate, oldEndDate);
        }
        component.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true);
        return component;
    }

    @Override
    public HelpCtx getHelp() {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
        // If you have context help:
        // return new HelpCtx("help.key.here");
    }

    @Override
    public boolean isValid() {
        // If it is always OK to press Next or Finish, then:
        return isValid;
        // If it depends on some condition (form filled out...) and
        // this condition changes (last form field filled in...) then
        // use ChangeSupport to implement add/removeChangeListener below.
        // WizardDescriptor.ERROR/WARNING/INFORMATION_MESSAGE will also be useful.
    }

    @Override
    public void addChangeListener(ChangeListener l) {
        listeners.add(ChangeListener.class, l);
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        listeners.remove(ChangeListener.class, l);
    }

    @Override
    public void readSettings(WizardDescriptor wiz) {
        this.descriptor = wiz;
        this.pathfinderRoles = (List<PathfinderRole>)wiz.getProperty(WizardKeys.PROP_LIST);
        Object objectId = wiz.getProperty(WizardKeys.PROP_ID);
        oldId = (objectId != null)? (Integer)objectId : -1;
        oldPathfinder = (Pathfinder)wiz.getProperty(WizardKeys.PROP_PATHFINDER);
        oldRole = (Role)wiz.getProperty(WizardKeys.PROP_ROLE);
        oldPlace = (String)wiz.getProperty(WizardKeys.PROP_PLACE);
        oldStartDate = (Date)wiz.getProperty(WizardKeys.PROP_START_DATE);
        oldEndDate = (Date)wiz.getProperty(WizardKeys.PROP_END_DATE);
        getComponent().addPropertyChangeListener(this);
    }

    @Override
    public void storeSettings(WizardDescriptor wiz) {
        wiz.putProperty(WizardKeys.PROP_PATHFINDER, component.getPathfinderComboBox().getSelectedItem());
        wiz.putProperty(WizardKeys.PROP_ROLE, component.getRoleComboBox().getSelectedItem());
        wiz.putProperty(WizardKeys.PROP_PLACE, component.getPlaceTextField().getText());
        wiz.putProperty(WizardKeys.PROP_START_DATE, component.getStartDatePicker().getDate());
        wiz.putProperty(WizardKeys.PROP_END_DATE, component.getEndDatePicker().getDate());
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        boolean oldState = isValid;
        Pathfinder pathfinder = (Pathfinder)component.getPathfinderComboBox().getSelectedItem();
        Role role = (Role)component.getRoleComboBox().getSelectedItem();
        String place = component.getPlaceTextField().getText();
        Date startDate = component.getStartDatePicker().getDate();
        Date endDate = component.getEndDatePicker().getDate();
        if(startDate.after(endDate)) {
            isValid = false;
            descriptor.getNotificationLineSupport().setErrorMessage(
                    bundle.getString("Wizard.Dates.Inverted"));
        } else if(pathfinder.equals(oldPathfinder) && role.equals(oldRole) && place.equals(oldPlace)
                && startDate.equals(oldStartDate) && endDate.equals(oldEndDate)) {
            isValid = false;
            descriptor.getNotificationLineSupport().setErrorMessage(
                    bundle.getString("Wizard.NoChanges"));
        } else {
            boolean overlappingInterval = false;
            if(pathfinderRoles != null) {
                for(PathfinderRole pathfinderRole : pathfinderRoles) {
                    if(pathfinderRole.getId() != oldId &&
                       pathfinderRole.getPathfinderId().equals(component.getPathfinderComboBox().getSelectedItem()) &&
                       pathfinderRole.getRoleId().equals(component.getRoleComboBox().getSelectedItem()) &&
                       pathfinderRole.getPlace().equalsIgnoreCase(component.getPlaceTextField().getText()) &&
                       dateOverlaps(startDate, endDate, pathfinderRole.getStartDate(), pathfinderRole.getEndDate())) {
                        overlappingInterval = true;
                        break;
                    }
                }
            }
            if(overlappingInterval) {
                isValid = false;
                descriptor.getNotificationLineSupport().setErrorMessage(
                        bundle.getString("Role.Pathfinder.Exist.Error"));
            } else {
                isValid = true;
                descriptor.getNotificationLineSupport().clearMessages();
            }
        }
        if(oldState != isValid) {
            ChangeEvent event = new ChangeEvent(this);
            for(ChangeListener listener : listeners.getListeners(ChangeListener.class)) {
                listener.stateChanged(event);
            }
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="Date Analisys Code">
    private boolean dateOverlaps(Date newStartDate, Date newEndDate, Date oldStartDate, Date oldEndDate) {
        if(!newStartDate.before(oldEndDate)) {
            return false;
        } else if(!newEndDate.after(oldStartDate)) {
            return false;
        } else {
            return true;
        }
    }// </editor-fold>
}
